package com.example.myapplication

import android.app.Service
import android.content.Intent
import android.database.Cursor
import android.media.MediaPlayer
import android.os.Binder
import android.os.Bundle
import android.os.IBinder
import android.provider.MediaStore
import android.util.Log
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import java.io.IOException

class MusicService : Service() {
    val TAG = "MusicService"
    companion object {
        val Commond = "Operate"
    }
    val mediaPlayer = MediaPlayer()
    val musicList: MutableList<String> = mutableListOf<String>()
    val musicNameList: MutableList<String> = mutableListOf<String>()
    var current = 0
    var isPause = false
    val binder = MusicBinder()
    inner class MusicBinder: Binder() {
        val musicName
            get() = musicNameList.get(current)
        var currentPosition
            get() = mediaPlayer.currentPosition
            set(value: Int) = mediaPlayer.seekTo(value)

        val duration
            get() = mediaPlayer.duration

        val size
            get() = musicList.size

        val currentIndex
            get() = current
    }

    override fun onCreate() {
        super.onCreate()
        getMusicList()
        mediaPlayer.setOnPreparedListener {
            it.start()
        }
        mediaPlayer.setOnCompletionListener {
            current++
            if (current >= musicList.size) {
                current = 0
            }
            play()
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val operate : Int = intent ?. getIntExtra(Commond, 1) ?: 1
        when(operate) {
            1 -> play()
            2 -> pause()
            3 -> stop()
            4 -> next()
            5 -> prev()
        }
            return super.onStartCommand(intent, flags, startId)
        }


    fun pause() {
        if (isPause) {
            mediaPlayer.start()
            isPause = false
        } else {
            mediaPlayer.pause()
            isPause = true
        }
    }

    fun stop() {
        mediaPlayer.stop()
        stopSelf()
    }

    fun next() {
        current++
        if (current >= musicList.size) {
            current = 0
        }
        play()
    }

    fun prev() {
        current--
        if (current < 0) {
            current = musicList.size - 1
        }
        play()
    }

    fun play() {
        if (musicList.size == 0) return
        val path: String = musicList[current]
        mediaPlayer.reset()
        try {
            mediaPlayer.setDataSource(path)
            mediaPlayer.prepareAsync()

        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    override fun onBind(intent: Intent): IBinder {
        return binder
    }

    private fun getMusicList() {
        val cursor: Cursor? = contentResolver.query(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            null,
            null,
            null,
            null
        )
        if (cursor!= null) {
            val dataColumnIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA)
            val titleColumnIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
            if (dataColumnIndex >= 0 && titleColumnIndex >= 0) {
                while (cursor.moveToNext()) {
                    val musicPath = cursor.getString(dataColumnIndex)
                    musicList.add(musicPath)
                    val musicName = cursor.getString(titleColumnIndex)
                    musicNameList.add(musicName)
                    Log.d(TAG, "getMusicList: $musicPath name:$musicName")
                }
            }
            cursor.close()
        }
    }
}